package com.tencent.org.service.impl;

import com.tencent.basic.service.impl.BaseServiceImpl;
import com.tencent.basic.util.MD5Utils;
import com.tencent.basic.util.StrUtils;
import com.tencent.org.domain.Employee;
import com.tencent.org.mapper.EmployeeMapper;
import com.tencent.org.service.IEmployeeService;
import com.tencent.user.domain.Logininfo;
import com.tencent.user.mapper.LogininfoMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 实现类 ： 员工 的 Service的 实现类
 * 控制事务 支持+只读  SUPPORTS - 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
 */
@Service
public class EmployeeServiceImpl extends BaseServiceImpl<Employee> implements IEmployeeService {
    @Autowired
    private LogininfoMapper logininfoMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    /**
     * 重写添加方法 在操作t_employee或t_user操作的时候都要同步操作t_logininfo
     * @param employee
     */
    @Override
    public void save(Employee employee) {
        // 加密加盐
        String salt = StrUtils.getComplexRandomString(32);
        String md5Pwd = MD5Utils.encrypByMd5(employee.getPassword() + salt);
        employee.setSalt(salt);
        employee.setPassword(md5Pwd);
        // 通过 employee对象 创建 logininfo对象
        Logininfo logininfo = employee2Logininfo(employee);
        // 将logininfo对象添加进数据库 得到自增长id 设置进employee对象中
        logininfoMapper.save(logininfo);
        employee.setLogininfo_id(logininfo.getId());
        // 添加employee
        super.save(employee);

        // 如果添加是选择了角色role
        if (employee.getRole_id() != null) {
            // 中间表没有实体类 更没有xml 所以在实体类的业务中操作 通过实体类xml添加
            // 将 employee的id 和 employee对应role的id 传入 就关联起来了
            employeeMapper.saveEmployeeRole(employee.getId(), employee.getRole_id());
        }

    }

    private Logininfo employee2Logininfo(Employee employee) {
        Logininfo logininfo = new Logininfo();
        // copy对象
        BeanUtils.copyProperties(employee, logininfo);
        // 0为管理员
        logininfo.setType(0);
        return logininfo;
    }

    /**
     * 重写删除方法 在操作t_employee或t_user操作的时候都要同步操作t_logininfo
     * @param id
     */
    @Override
    public void remove(Long id) {
        // 通过employee的id  查询中间表employee_role 有就删除了
        employeeMapper.removeEmployeeRole(id);

        Employee employee = employeeMapper.loadById(id);
        //删除登录信息表数据
        employeeMapper.remove(employee.getLogininfo_id());
        //删除employee表数据
        super.remove(id);


    }

    /**
     * 重写修改方法 在操作t_employee或t_user操作的时候都要同步操作t_logininfo
     * @param employee
     */
    @Override
    public void update(Employee employee) {
        // 通过employee的id  查询中间表employee_role   先删除关联信息 再重新添加
        employeeMapper.removeEmployeeRole(employee.getId());

        // 如果修改选择了角色role
        if (employee.getRole_id() != null) {
            // 中间表没有实体类 更没有xml 所以在实体类的业务中操作 通过实体类xml添加
            // 将 employee的id 和 employee对应role的id 传入 就关联起来了
            employeeMapper.saveEmployeeRole(employee.getId(), employee.getRole_id());
        }

        // 加密加盐
        String salt = StrUtils.getComplexRandomString(32);
        String md5Pwd = MD5Utils.encrypByMd5(employee.getPassword()+salt);
        employee.setSalt(salt);
        employee.setPassword(md5Pwd);

        // 转换对象
        Logininfo logininfo = employee2Logininfo(employee);
        // 获取登陆信息id
        Long logininfo_id = employeeMapper.loadById(employee.getId()).getLogininfo_id();
        // 设置进去
        logininfo.setId(logininfo_id);
        // 就可以根据id修改了
        logininfoMapper.update(logininfo);

        super.update(employee);
    }
}
